

import UnitX from "../../entity/UnitX";
import L_Run from "../../utils/L_Run";


export type BrkStrikeRs={
    /**是否完美防御 */
    prefectDef:boolean,
    /**格挡成功 | 格挡失败后  此击的韧性削减值 */
    tenaReduceVal:number,
    /**没有完美格挡 修正破招打击的伤害的修正比率  dmg=dmg*dmgCorrectionRate  
     * 同时也是崩解技能执行几率破招的体现参数
     */
    dmgCorrectionRate:number,
    /**是否可以造成破招 */
    breakAction:boolean
}

/** 招架/完美闪避算法 */
export default class CrackStrikeFormula{
 
    private static readonly  TS_DEF_RATIO=200   //格挡系数 值越大回避收益越低    10:0.95,20:0.9 ,20:0.9 ,50:0.8 ,100:0.66,200:0.5,300:0.4,400:0.33,500:0.28
    private static readonly  BREAK_ACTION_PRECENT_VAL=65 //能够达到破招的百分比值   为了防止破招值不够高 玩家已经精准判断还是无法打断的尴尬 现在是破招差值400->65% 可以根据设计调整
 
  /**
     * 完美防御判定
     * @param baseBtVal 技能基础破招值
     * @param baseTennaR 技能基础削韧值
     * @param aux 攻击单位unitx
     * @param bux 被伤害单位unitx
     * @returns 是否命中布尔值
     */
  public static  breakStrikeSts(baseBtVal:number,baseTennaR:number,aux:UnitX,bux:UnitX):BrkStrikeRs{
  
    let bt=baseBtVal+(aux.attrs?.bt || 0)+aux.lvl
    let def_posture=(bux.attrs?.def_posture || 0)+bux.lvl    


    if(def_posture>=bt){   
        //防御架势>破招值  完美防御
        return {prefectDef:true,tenaReduceVal:0,dmgCorrectionRate:0,breakAction:false}
    }else{
        //破招>防御架势 非完美防御 计算破招打击的伤害倍率(只会存在无限接近1倍的情况  因为本来破招打击就是超高基础数值)
        let tsdv=bt-def_posture
        let dcr=tsdv/(CrackStrikeFormula.TS_DEF_RATIO+tsdv)    //ts打击最终伤害系数 
        let tennaRF=0  //ts打击最终削韧值
        if(baseTennaR>0){
            let dcrx=dcr*1.5
            if(dcrx>1) dcrx=1  //破招值也会影响削韧幅度 (但是设计上更趋近于达成1倍原始削韧倍数 不至于衰减太严重)
            tennaRF=baseTennaR*(1+((aux.attrs?.dtg_i || 0)-(bux.attrs?.dtg_r || 0))/100)*dcrx
            if(tennaRF<1){
                tennaRF=0
            }
        }
        //计算是否能造成破招
        let breakAction=L_Run.RandomInt_L(0,CrackStrikeFormula.BREAK_ACTION_PRECENT_VAL)<dcr*100
        return {prefectDef:false,tenaReduceVal:tennaRF,dmgCorrectionRate:dcr,breakAction:breakAction}
    }
}   
 

  
}  